package com.liuyi.netty.im.commons.codes;

import com.liuyi.netty.im.commons.codes.data.DataEvent;
import com.liuyi.netty.im.commons.codes.data.DataLogin;
import com.liuyi.netty.im.commons.codes.data.LimData;
import com.liuyi.netty.im.commons.codes.data.event.message.playload.*;
import lombok.Getter;

/**
 * @author Mr.Fmy
 * @since 2021-11-23
 */
public class CodeConst {

    /**
     * 魔数
     */
    public static final int MAGIC_NUMBER = 21544914;

    /**
     * 最小版本号
     */
    public static final byte MIN_VERSION = 1;

    /**
     * 最大版本号
     */
    public static final byte MAX_VERSION = 2;

    /**
     * JSON序列化
     */
    public static final byte CONTENT_TYPE_JSON = 0;

    /**
     * JDK序列化
     */
//    public static final byte CONTENT_TYPE_JDK = 1;

    /**
     * JACKSON序列化
     */
//    public static final byte CONTENT_TYPE_JACKSON = 2;

    public enum Command {

        /**
         * 心跳
         */
        HEARTBEAT((byte) 2, null),

        /**
         * 登录 会触发 {@link CodeConst.Event.READY 事件}
         */
        LOGIN((byte) 5, DataLogin.class),

        /**
         * 退出 会触发 {@link CodeConst.Event.NOT_READY 事件}
         */
        LOGOUT((byte) 6, null),

        /**
         * 事件通知
         */
        EVENT((byte) 10, DataEvent.class);

        private final byte command;

        private final Class<? extends LimData> tClass;

        Command(byte command, Class<? extends LimData> tClass) {
            this.command = command;
            this.tClass = tClass;
        }

        public byte getCommand() {
            return command;
        }

        public Class<? extends LimData> gettClass() {
            return tClass;
        }
    }

    public enum Event {

        /**
         * 就绪
         */
        READY,
        /**
         * 未就绪
         */
        NOT_READY,
        /**
         * 收到消息事件
         */
        MESSAGE_RECEIVED,
        /**
         * 好友申请事件
         */
        FRIENDS_APPLY,
        /**
         * 好友申请结果事件
         */
        FRIENDS_APPLY_RESULT,
        /**
         * 群申请事件
         */
        GROUP_APPLY,
        /**
         * 群申请结果事件
         */
        GROUP_APPLY_RESULT,
        /**
         * 群解散事件
         */
        GROUP_DISSOLVE,
        /**
         * 会话列表刷新事件
         */
        SESSION_LIST_REFRESH;
    }

    public enum EventToType {
        USER,
        CHANNELID
    }

    /**
     * 消息所属会话类型
     */
    public enum SessionType {
        /**
         * 群聊
         */
        GROUP,
        /**
         * 私聊
         */
        C2C,
    }

    /**
     * 消息类型
     */
    public enum MsgType {
        /**
         * 文本
         */
        TEXT(PlayloadText.class),
        /**
         * 图片
         */
        IMAGE(PlayloadImage.class),
        /**
         * 视频
         */
        VIDEO(PlayloadVideo.class),
        /**
         * 语音
         */
        VOICE(PlayloadVoice.class),
        /**
         * 系统消息
         * 群聊或者个人都可，（无论是群聊还是个人）只会发送给个人
         */
        SYS(PlayloadSys.class),
        /**
         * 群@消息
         */
        GROUP_ALT(PlayloadGroupAlt.class),
        /**
         * 群系统消息
         */
        GROUP_SYS(PlayloadGroupSys.class),
        /**
         * 群提示消息
         */
        GROUP_HINT(PlayloadGroupHint.class);

        @Getter
        private final Class<? extends Playload> tClass;

        MsgType(Class<? extends Playload> tClass) {
            this.tClass = tClass;
        }
    }

    /**
     * 消息流向
     */
    public enum MsgFlow {

        IN,
        OUT
    }

}
